<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 原型链

      // 对象是有自身和原型构成 ，原型又是一个对象。。。原型链

      // let obj = {
      //     name:"张三",
      //     age:20
      // }
      // let obj2 = new Object();
      // obj2.name = "李四";
      // obj2.age = 21;

      // let obj = {
      //     name:"张三",
      //     age:20
      // }

      // // console.log(obj);
      // Object.setPrototypeOf(obj,{
      //     height:"178cm"
      // })

      // console.log(obj);

      // 顶层的原型 是null
      // console.log(  Object.prototype.__proto__);

      // 对象的属性或者方法查找顺序；
      // 对象先在自身查找属性和方法 ，如果没有找到 在原型上查找 ，
      // 如果还没有找到会在原型链上查找，如果还没找到就返还undefined；

      // Object.prototype.age = 30;

      // function Person(){
      //     // this.age = 10;
      // }

      // // Person.prototype.age = 20;

      // let zhangsan = new Person();
      // console.log(zhangsan.age);

      // 找自身 ，在原型，找原型链，如果都没有返还undefined；

      //注意： 对象的循环问题，for in :会循环自身和原型链上的内容；
      Object.prototype.num = "10"; //添加到object的原型中(和_proto__同级 已经是最底层了)
      //   Object.prototype.__proto__.hahah = "10";//已经不能往下设置了
      let obj = {
        name: "张安",
        age: 20,
      };

      Object.setPrototypeOf(obj, { height: "178cm" }); //设置原型height和Object.prototype同级
      Object.setPrototypeOf(obj, { weight: "60kg" });
      console.log(obj);
      for (let key in obj) {
        console.log(key); //obj所有的属性和方法(包括Object和Object.prototype的)
        if (obj.hasOwnProperty(key)) {
          console.log("**", key);
        }
      }
      // 通过一个函数判断 某个属性或者方法是否是对象的自身属性和方法 而不是Object原型自带的；obj.hasOwnProperty('key');
    </script>
  </body>
</html>
